package modelo;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;

import org.hibernate.criterion.Restrictions;
import dao.imp.Base_DatosDAO;

public class Empresa {
	private String rif;
	private String nombre;
	private String telefono;
	private String ubicacion;
	private char estatus;
	private final static String INICIAL_CODIGO_FRESA="FRE";
	private final static String INICIAL_CODIGO_PRODUCTO="PROD";
	private final static String INICIAL_CODIGO_UNIDAD="UNID-";
	
	public Empresa() {
		super();
	}

	public Empresa(String rif, String nombre, String telefono,
			String ubicacion, char estatus) {
		super();
		this.rif = rif;
		this.nombre = nombre;
		this.telefono = telefono;
		this.ubicacion = ubicacion;
		this.estatus = estatus;
	}

	public String getRif() {
		return rif;
	}

	public void setRif(String rif) {
		this.rif = rif;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public String getUbicacion() {
		return ubicacion;
	}

	public void setUbicacion(String ubicacion) {
		this.ubicacion = ubicacion;
	}

	public char getEstatus() {
		return estatus;
	}

	public void setEstatus(char estatus) {
		this.estatus = estatus;
	} 
	
	public String Generar_Codigo_Fresa(){
		List<Fresa> fresas = getFresas();
		fresas.addAll(getFresas_Eliminadas());
		return this.INICIAL_CODIGO_FRESA+(fresas.size()+1); 
	}
	
	public String Generar_Codigo_Producto(){
		List<Producto> productos = this.getProductos();
		productos.addAll(getProductos_Eliminados());
		return this.INICIAL_CODIGO_PRODUCTO+(productos.size()+1); 
	}

	public String Generar_Codigo_Unidad(){
		List<Unidad> unidades = getUnidades();
		unidades.addAll(this.getUnidades_Eliminadas());
		return this.INICIAL_CODIGO_UNIDAD+(unidades.size()+1); 
	}
	
	public int Generar_Numero_Compra(){
		List<Compra> compras = getCompras();
		return compras.size()+1;
	}
	
	public int Generar_Numero_Venta(){
		List<Venta> compras = getVentas();
		return compras.size()+1;
	}
	
	public int Generar_Numero_Pago(){
		List<Pago> pagos = getPagos();
		return pagos.size()+1;
	}
	
	public List<Pago> getPagos(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Pago> pagos = conexion.findByProperty(Pago.class, Restrictions.eq("estatus", 'a'));
		return pagos;
	}
	
	public List<Compra> Clasificar_Compras_Tipo(List<Compra> compras,Tipo_Compra tipo){
		List<Compra> compras_clasificadas = new ArrayList<Compra>();
		compras_clasificadas.clear();
		for (int i=0;i<compras.size();i++){
			if (compras.get(i).getTipo_compra().getCodigo().equals(tipo.getCodigo())){
				compras_clasificadas.add(compras.get(i));
			}
		}
		return compras_clasificadas;
	}
	
	public List<Fresa> getFresas(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Fresa> fresas = conexion.findByProperty(Fresa.class, Restrictions.eq("estatus", 'a'));
		return fresas;
	}
	
	public List<Tipo_Compra> getTipos_Compra(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Tipo_Compra> tipos = conexion.findByProperty(Tipo_Compra.class, Restrictions.eq("estatus", 'a'));
		return tipos;
	}
	
	public List<Unidad> getUnidades(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Unidad> unidades = conexion.findByProperty(Unidad.class, Restrictions.eq("estatus", 'a'));
		return unidades;
	}
	
	public List<Unidad> getUnidades_Eliminadas(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Unidad> unidades = conexion.findByProperty(Unidad.class, Restrictions.eq("estatus", 'e'));
		return unidades;
	}
	
	public List<Fresa> getFresas_Eliminadas(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Fresa> fresas = conexion.findByProperty(Fresa.class, Restrictions.eq("estatus", 'e'));
		return fresas;
	}
	
	public List<Cliente> getClientes(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Cliente> clientes = conexion.findByProperty(Cliente.class, Restrictions.eq("estatus", 'a'));
		return clientes;
	}
	
	public List<Cliente> getClientes_Eliminados(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Cliente> clientes = conexion.findByProperty(Cliente.class, Restrictions.eq("estatus", 'e'));
		return clientes;
	}
	
	public Cliente Buscar_Cliente(String cedula_rif){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Cliente> clientes = conexion.findByProperty(Cliente.class, Restrictions.idEq(cedula_rif));
		if (clientes.size()==0){
			return null;
		}else{
			Cliente cliente = new Cliente(clientes.get(0).getCedula_rif(), clientes.get(0).getNombre(), clientes.get(0).getApellido(), clientes.get(0).getTelefono(), clientes.get(0).getUbicacion(), clientes.get(0).getEstatus());
			return cliente;
		}
	}
	
	public Producto Buscar_Producto(String codigo) {
		List<Producto> productos = getProductos();int pos=-1;
		for (int i=0;i<productos.size();i++){
			if (codigo.equals(productos.get(i).getCodigo())){
				pos=i;i=productos.size();
			}
		}
		if (pos==-1){
			return null;
		}else {
			Producto producto = new Producto(codigo, productos.get(pos).getNombre(), productos.get(pos).getUnidad(), productos.get(pos).getEstatus());
			return producto;
		}
	}
	
	public Unidad Buscar_Unidad(String codigo){
		List<Unidad> unidades = getUnidades();int pos=-1;
		for (int i=0;i<unidades.size();i++){
			if (codigo.equals(unidades.get(i).getCodigo())){
				pos=i;i=unidades.size();
			}
		}
		if (pos==-1){
			return null;
		}else {
			Unidad unidad = new Unidad(codigo, unidades.get(pos).getNombre(), unidades.get(pos).getEstatus());
			return unidad;
		}
	}
	
	public Fresa Buscar_Fresa(String codigo){
		List<Fresa> fresas = getFresas();int pos=-1;
		for (int i=0;i<fresas.size();i++){
			if (codigo.equals(fresas.get(i).getCodigo())){
				pos=i;i=fresas.size();
			}
		}
		if (pos==-1){
			return null;
		}else {
			Fresa fresa = new Fresa(codigo, fresas.get(pos).getNombre(), fresas.get(pos).getEstatus());
			return fresa;
		}
	}
	
	public Usuario Buscar_Usuario(String id){
		List<Usuario> usuarios = getUsuarios();
		Usuario usuario = null;
		for (int i=0;i<usuarios.size();i++){
			if (id.equals(usuarios.get(i).getId())){
				usuario = usuarios.get(i);
				i=usuarios.size();
			}
		}
		return usuario;
	}
	
	public List<Compra> getCompras(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Compra> compras = conexion.findByProperty(Compra.class, Restrictions.eq("estatus", 'a'));
		return compras;
	}
	
	
	public Tipo_Compra Buscar_Tipo(String nombre) {
		List<Tipo_Compra> tipos = getTipos_Compra();
		int pos=-1;
		for (int i=0;i<tipos.size();i++){
			if (nombre.equals(tipos.get(i).getDescripcion())){
				pos=i;i=tipos.size();
			}
		}
		if (pos==-1){
			return null;
		}else {
			Tipo_Compra tipo = new Tipo_Compra(tipos.get(pos).getCodigo(), tipos.get(pos).getDescripcion(), tipos.get(pos).getEstatus());
			return tipo;
		}
	}
	
	public List<Venta> getVentas(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Venta> ventas = conexion.findByProperty(Venta.class, Restrictions.eq("estatus", 'a'));
		return ventas;
	}
	
	public List<Producto> getProductos(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Producto> productos = getProductos_Activos();
		productos.addAll(getProductos_Eliminados());
		return productos;
	}
	
	public List<Producto> getProductos_Eliminados(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Producto> productos = conexion.findByProperty(Producto.class, Restrictions.eq("estatus", 'e'));
		return productos;
	}
	
	public List<Producto> getProductos_Activos(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Producto> productos = conexion.findByProperty(Producto.class, Restrictions.eq("estatus", 'a'));
		return productos;
	} 
	
	public List<Usuario> getUsuarios_Activos(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Usuario> usuarios = conexion.findByProperty(Usuario.class, Restrictions.eq("estatus", 'a'));
		return usuarios;
	}
	
	public List<Usuario> getUsuarios_Eliminados(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Usuario> usuarios = conexion.findByProperty(Usuario.class, Restrictions.eq("estatus", 'e'));
		return usuarios;
	}
	
	public List<Usuario> getUsuarios(){
		List<Usuario> usuarios = getUsuarios_Activos();
		usuarios.addAll(getUsuarios_Eliminados());
		return usuarios;
	}
	
	public List<Compra> Compras_Cliente(Cliente cliente){
		Base_DatosDAO conexion = new Base_DatosDAO(); 
		List<Compra> compras_cliente = conexion.findBySQLQuery("select * from compra where numero in (select compra from detalle_cliente_compra where cliente='"+cliente.getCedula_rif()+"')", "compras", Compra.class);
		return compras_cliente;
	}
	
	public List<Compra> Compras_Cliente_Proveedor(Cliente cliente){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Compra> compras = Compras_Cliente(cliente);
		List<Compra> compras_proveedor = this.Clasificar_Compras_Tipo(compras,(Tipo_Compra) conexion.findByProperty(Tipo_Compra.class, Restrictions.idEq("C-PROV")).get(0));
		return compras_proveedor;
	}
	
	public double MontoTotal_Compra_Cliente_Proveedor(Cliente cliente) throws ParseException{
		List<Compra> compras_proveedor = this.Compras_Cliente_Proveedor(cliente);
		double total=0;
		for (int i=0;i<compras_proveedor.size();i++){
			total+=compras_proveedor.get(i).MontoPagar_Cliente();
		}
		return total;
	}
	
	public List<Compra> Compras_Cliente_Medianero(Cliente cliente){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Compra> compras = Compras_Cliente(cliente);
		List<Compra> compras_medianero = this.Clasificar_Compras_Tipo(compras,(Tipo_Compra) conexion.findByProperty(Tipo_Compra.class, Restrictions.idEq("C-MED")).get(0));
		return compras_medianero;
	}
	
	public double MontoTotal_Compra_Cliente_Medianero(Cliente cliente) throws ParseException{
		List<Compra> compras_medianero = this.Compras_Cliente_Medianero(cliente);
		double total=0;
		for (int i=0;i<compras_medianero.size();i++){
			total+=compras_medianero.get(i).MontoPagar_Cliente();
		}
		return total;
	}
	
	public double Total_Compra_Cliente(Cliente cliente) throws ParseException{
		return this.MontoTotal_Compra_Cliente_Medianero(cliente)+this.MontoTotal_Compra_Cliente_Proveedor(cliente);
	}
	
	public List<Venta> Ventas_Cliente(Cliente cliente){
		Base_DatosDAO conexion = new Base_DatosDAO(); 
		List<Venta> ventas_cliente = conexion.findBySQLQuery("select * from venta where cliente='"+cliente.getCedula_rif()+"'", "ventas", Venta.class);
		return ventas_cliente;
	}
	
	public double Total_Venta_Cliente(Cliente cliente) throws ParseException{
		List<Venta> ventas = this.Ventas_Cliente(cliente);
		double total=0;
		for (int i=0;i<ventas.size();i++){
			total+=ventas.get(i).MontoTotal_Venta();
		}
		return total;
	}
	
	public double Total_Pagos_Cliente(Cliente cliente){
		return cliente.MontoTotalPagos();
	}
	
	public int Registrar_Cliente(Cliente cliente){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Cliente> clientes = conexion.findByProperty(Cliente.class, Restrictions.idEq(cliente.getCedula_rif()));
		if(clientes.size()==1){
			if (clientes.get(0).getEstatus()=='e'){
				return 2;
			}else
				return 0;
		}
		else{
			conexion.save(cliente);
			return 1;
		}
	}
	
	public int Registrar_Fresa(Fresa fresa){
		Base_DatosDAO conexion = new Base_DatosDAO();
		if(Buscar_Fresa(fresa.getCodigo())!=null){
			return 0;
		}else{
			List<Fresa> fresas = conexion.findBySQLQuery("select * from fresa", "fresas", Fresa.class);
			Fresa fresa_aux;boolean encontro=false;int posicion=-1;
			for (int i=0;i<fresas.size();i++){
				fresa_aux = fresas.get(i);	
				if (fresa_aux.getNombre().replace(" ", "").toLowerCase().equals(fresa.getNombre().replace(" ", "").toLowerCase())){
					posicion = i;
					i=fresas.size();
					encontro = true;				
				}
			}
			if(encontro){
				if(fresas.get(posicion).getEstatus()=='e')
					return 3;
				else
					return 2;
			}else{
				conexion.save(fresa);
				return 1;
			}
		}
	}
	
	public int Registrar_Producto(Producto producto){
		Base_DatosDAO conexion = new Base_DatosDAO();
		if(conexion.findByProperty(Producto.class, Restrictions.idEq(producto.getCodigo())).size()==1)
			return 0;
		else{
			List<Producto> productos = conexion.findBySQLQuery("select * from producto", "productos", Producto.class);
			Producto producto_aux;boolean encontro=false;int posicion=-1;
			for (int i=0;i<productos.size();i++){
				producto_aux = productos.get(i);	
				if (producto_aux.getNombre().replace(" ", "").toLowerCase().equals(producto.getNombre().replace(" ", "").toLowerCase())){
					posicion = i;
					i=productos.size();
					encontro = true;				
				}
			}
			if(encontro){
				if(productos.get(posicion).getEstatus()=='e')
					return 3;
				else
					return 2;
			}else{
				conexion.save(producto);
				return 1;
			}
		}
	}
	
	public boolean Registrar_Usuario(Usuario usuario){
		Base_DatosDAO conexion = new Base_DatosDAO();
		if(conexion.findByProperty(Usuario.class, Restrictions.idEq(usuario.getId())).size()==1)
			return false;
		else{
			conexion.save(usuario);
			return true;
		}
	}

	public int Registar_TipoCompra(Tipo_Compra tipo){
		Base_DatosDAO conexion = new Base_DatosDAO();
		if(conexion.findByProperty(Tipo_Compra.class, Restrictions.idEq(tipo.getCodigo())).size()==1)
			return 0;
		else{
			List<Tipo_Compra> tipos = conexion.findBySQLQuery("select * from tipo_compra", "tipos", Tipo_Compra.class);
			Tipo_Compra tipo_aux;boolean encontro=false;int posicion=-1;
			for (int i=0;i<tipos.size();i++){
				tipo_aux = tipos.get(i);	
				if (tipo_aux.getDescripcion().replace(" ", "").toLowerCase().equals(tipo.getDescripcion().replace(" ", "").toLowerCase())){
					posicion = i;
					i=tipos.size();
					encontro = true;				
				}
			}
			if(encontro){
				if(tipos.get(posicion).getEstatus()=='e')
					return 3;
				else
					return 2;
			}else{
				conexion.save(tipo);
				return 1;
			}
		}
	}
	
	public int Registrar_Unidad(Unidad unidad){
		Base_DatosDAO conexion = new Base_DatosDAO();
		if(conexion.findByProperty(Tipo_Compra.class, Restrictions.idEq(unidad.getCodigo())).size()==1)
			return 0;
		else{
			List<Unidad> unidades = conexion.findBySQLQuery("select * from unidad", "tipos", Unidad.class);
			Unidad unidad_aux;boolean encontro=false;int posicion=-1;
			for (int i=0;i<unidades.size();i++){
				unidad_aux = unidades.get(i);	
				if (unidad_aux.getNombre().replace(" ", "").toLowerCase().equals(unidad.getNombre().replace(" ", "").toLowerCase())){
					posicion = i;
					i=unidades.size();
					encontro = true;				
				}
			}
			if(encontro){
				if(unidades.get(posicion).getEstatus()=='e')
					return 3;
				else
					return 2;
			}else{
				conexion.save(unidad);
				return 1;
			}
		}
	}

	public void Registrar_Compra(Compra compra,List<Detalle_Compra> detalles,List<Detalle_Cliente_Compra> clientes){
		Base_DatosDAO conexion = new Base_DatosDAO();
		conexion.save(compra);
		Date hoy = new Date();
		Cliente cliente;
		for (int i=0;i<clientes.size();i++){
			cliente= clientes.get(i).getCliente();
			String fecha= hoy.toLocaleString().substring(6,10)+"-"+hoy.toLocaleString().substring(3, 5);
			List cuentas = conexion.findBySQLQuery("select * from cuenta where substr(fecha,1,7)='"+fecha+"' and cliente='"+cliente.getCedula_rif()+"'","cuenta_activa",Cuenta.class);
			if (cuentas.size()==0){
				Cuenta cuenta = new Cuenta(generarIdCuenta(), cliente, hoy);
				conexion.save(cuenta);
			}
		}
		for (int i=0;i<detalles.size();i++){
			conexion.save(detalles.get(i));
		}
		for (int x=0;x<clientes.size();x++){
			conexion.save(clientes.get(x));
		}
	}
	
	public void Registrar_Pago(Pago pago){
		Base_DatosDAO conexion = new Base_DatosDAO();
		conexion.save(pago);
	}
	
	public void Registrar_Venta (Venta venta,List<Detalle_Venta> detalles){
		Base_DatosDAO conexion = new Base_DatosDAO();
		conexion.save(venta);
		for (int i=0;i<detalles.size();i++){
			conexion.save(detalles.get(i));
		}
	}

	public boolean Actualizar_Fresa_oProducto_oTipoCompra_oUnidad_oCliente_oUsuario_oEmpresa(Fresa fresa,Producto producto,Tipo_Compra tipo,Unidad unidad,Cliente cliente,Usuario usuario,Empresa empresa){
		Base_DatosDAO conexion = new Base_DatosDAO();
		if (fresa!=null){
			if (conexion.findByProperty(Fresa.class, Restrictions.idEq(fresa.getCodigo())).size()==1){
				conexion.update(fresa);
				return true;
			}else
				return false;
		}else if(producto!=null){
			if (conexion.findByProperty(Producto.class, Restrictions.idEq(producto.getCodigo())).size()==1){
				conexion.update(producto);
				return true;
			}else
				return false;
		}else if (tipo!=null){
			if (conexion.findByProperty(Tipo_Compra.class, Restrictions.idEq(tipo.getCodigo())).size()==1){
				conexion.update(tipo);
				return true;
			}else
				return false;
		}else if (unidad!=null){
			if (conexion.findByProperty(Unidad.class, Restrictions.idEq(unidad.getCodigo())).size()==1){
				conexion.update(unidad);
				return true;
			}else
				return false;
		}else if (cliente!=null){
			if (conexion.findByProperty(Cliente.class, Restrictions.idEq(cliente.getCedula_rif())).size()==1){
				conexion.update(cliente);
				return true;
			}else
				return false;
		}else if (usuario!=null){
			if (conexion.findByProperty(Usuario.class, Restrictions.idEq(usuario.getId())).size()==1){
				conexion.update(usuario);
				return true;
			}else
				return false;
		}else if (empresa!=null){
			if (conexion.findByProperty(Empresa.class, Restrictions.idEq(this.getRif())).size()==1){
				conexion.update(empresa);
				return true;
			}else
				return false;
		}else
			return false;
	}
	
	public boolean Actualizar_Fresa(Fresa fresa){
		return Actualizar_Fresa_oProducto_oTipoCompra_oUnidad_oCliente_oUsuario_oEmpresa(fresa, null, null, null, null, null, null);
	}
	
	public boolean Actualizar_Producto(Producto producto){
		return Actualizar_Fresa_oProducto_oTipoCompra_oUnidad_oCliente_oUsuario_oEmpresa(null, producto, null, null, null, null, null);
	}
	
	public boolean Actualizar_TipoCompra(Tipo_Compra tipo){
		return Actualizar_Fresa_oProducto_oTipoCompra_oUnidad_oCliente_oUsuario_oEmpresa(null, null, tipo, null, null, null, null);
	}
	
	public boolean Actualizar_Unidad(Unidad unidad){
		return Actualizar_Fresa_oProducto_oTipoCompra_oUnidad_oCliente_oUsuario_oEmpresa(null, null, null, unidad, null, null, null);
	}
	
	public boolean Actualizar_Cliente(Cliente cliente){
		return Actualizar_Fresa_oProducto_oTipoCompra_oUnidad_oCliente_oUsuario_oEmpresa(null, null, null, null, cliente, null, null);
	}
	
	public boolean Actualizar_Usuario(Usuario usuario){
		return Actualizar_Fresa_oProducto_oTipoCompra_oUnidad_oCliente_oUsuario_oEmpresa(null, null, null, null, null, usuario, null);
	}
	
	public boolean Actualizar_Empresa(Empresa empresa){
		return Actualizar_Fresa_oProducto_oTipoCompra_oUnidad_oCliente_oUsuario_oEmpresa(null, null, null, null, null, null, this);
	}

	public boolean Eliminar_Fresa(Fresa fresa){
		if (fresa!=null){
			fresa.setEstatus('e');
			return Actualizar_Fresa(fresa);
		}else
			return false;
	
	}
	
	public boolean Eliminar_Producto(Producto producto){
		if (producto!=null){
			producto.setEstatus('e');
			return Actualizar_Producto(producto);	
		}else
			return false;
		
	}
	
	public boolean Eliminar_TipoCompra(Tipo_Compra tipo){
		if (tipo!=null){
			tipo.setEstatus('e');
			return Actualizar_TipoCompra(tipo);
		}else
			return false;
	}
	
	public boolean Eliminar_Unidad(Unidad unidad){
		if (unidad!=null){
			unidad.setEstatus('e');
			return Actualizar_Unidad(unidad);
		}else
			return false;
	}
	
	public boolean Eliminar_Cliente(Cliente cliente){
		if (cliente!=null){
			cliente.setEstatus('e');
			return Actualizar_Cliente(cliente);
		}else
			return false;
	}
	
	public boolean Eliminar_Usuario(Usuario usuario){
		if (usuario!=null){
			usuario.setEstatus('e');
			return Actualizar_Usuario(usuario);
		}else 
			return false;
	}

	public boolean Reactivar_Fresa(Fresa fresa){
		if (fresa!=null){
			fresa.setEstatus('a');
			return Actualizar_Fresa(fresa);
		}else
			return false;
	}
	
	public boolean Reactivar_Producto(Producto producto){
		if (producto!=null){
			producto.setEstatus('a');
			return Actualizar_Producto(producto);
		}else
			return false;
	}
	
	public boolean Reactivar_TipoCompra(Tipo_Compra tipo){
		if (tipo!=null){
			tipo.setEstatus('a');
			return Actualizar_TipoCompra(tipo);
		}else
			return false;
	}
	
	public boolean Reactivar_Unidad(Unidad unidad){
		if (unidad!=null){
			unidad.setEstatus('a');
			return Actualizar_Unidad(unidad);
		}else
			return false;
	}
	
	public boolean Reactivar_Cliente(Cliente cliente){
		if (cliente!=null){
			cliente.setEstatus('a');
			return Actualizar_Cliente(cliente);
		}else 
			return false;
	}
	
	public boolean Reactiva_Usuario(Usuario usuario){
		if (usuario!=null){
			usuario.setEstatus('a');
			return Actualizar_Usuario(usuario);
		}else
			return false;
	}

	public List<Cuenta> Buscar_Cuentas_Cliente(Cliente cliente) {
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Cuenta> cuentas = conexion.findByProperty(Cuenta.class, Restrictions.eq("cliente", cliente));
		return cuentas;
	}
	public List<Cuenta> Buscar_Cuentas_NoCerradas_Cliente(Cliente cliente) throws ParseException{
		List<Cuenta> cuentas,cuentas_nocerradas;
		cuentas = Buscar_Cuentas_Cliente(cliente);
		cuentas_nocerradas = new ArrayList();
		Cuenta cuenta;
		for(int i=0;i<cuentas.size();i++){
			cuenta = cuentas.get(i);
			if(!cuenta.Cuenta_Cerrada()){
				cuentas_nocerradas.add(cuenta);
			}
		}
		return cuentas_nocerradas;
	}

	public List<Tipo_Pago> getTipos_Pago() {
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Tipo_Pago> tipos = conexion.findByProperty(Tipo_Pago.class, Restrictions.eq("estatus", 'a'));
		return tipos;
	}

	public Cuenta buscarCuenta(String id) {
		Base_DatosDAO conexion = new Base_DatosDAO();
		List cuentas = conexion.findByProperty(Cuenta.class, Restrictions.idEq(id));
		if (cuentas.size()==0){
			return null;
		}else{
			Cuenta cuenta = (Cuenta) cuentas.get(0);
			return cuenta;
		}
	}

	public String generarIdCuenta() {
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Cuenta> ids = conexion.findBySQLQuery("select * from cuenta where id=(select max(id) from cuenta)","ultimaid",Cuenta.class);
		if (ids.size()==0){
			return "1";
		}else {
			return String.valueOf(Integer.parseInt(ids.get(0).getId())+1);
		}
	}
}
